/*
    view模块：主要将从model模块获得的数据渲染成网页，对外提供调用接口
*/
#pragma once
#include <iostream>
#include <string>
#include <ctemplate/template.h> //谷歌开发的渲染网页的c/c++第三方库（将我们的数据渲染到对应的网页中）
#include "model.hpp"

namespace ns_view
{
    using namespace ns_model;

    const std::string template_path = "./template_html/";

    class View
    {
    public:
        View()
        {
        }
        ~View()
        {
        }

        // 渲染题目列表
        void expandQuestionslist(std::vector<Item> &tokens, std::string& html)
        {
            // 1、定义数据字典
            ctemplate::TemplateDictionary dict("questions_list"); //定义对象+取名
            for(auto& e : tokens)
            {
                ctemplate::TemplateDictionary *sub = dict.AddSectionDictionary("item"); //形成子字典
                sub->SetValue("number", e.number);
                sub->SetValue("title", e.title);
                sub->SetValue("star", e.star);
                // sub->SetValue("cpulimit", std::to_string(e.cpulimit));
                // sub->SetValue("memelimit", std::to_string(e.memlimit));
            }

            // 2、形成网页对象（类似于打开文件）
            std::string html_path = template_path + "questions_list.html";
            // html_path:要渲染的网页地址，ctemplate::DO_NOT_STRIP：网页渲染时不需要有优化（跳过空行等）
            ctemplate::Template *htl = ctemplate::Template::GetTemplate(html_path, ctemplate::DO_NOT_STRIP);

            //3、渲染
            htl->Expand(&html, &dict); //html最终渲染后的网页成品
        }

        // 渲染具体题目
        void expandQuestion(Question &ques, std::string& html)
        {
            // 1、定义数据字典
            ctemplate::TemplateDictionary dict("question"); //定义对象+取名
            dict.SetValue("number", ques.item.number);
            dict.SetValue("title", ques.item.title);
            dict.SetValue("star", ques.item.star);
            dict.SetValue("cpulimit", std::to_string(ques.item.cpulimit));
            dict.SetValue("memlimit", std::to_string(ques.item.memlimit));
            dict.SetValue("desc", ques.desc);
            dict.SetValue("head", ques.head);
            //dict.SetValue("tail", ques.tail);

            // 2、形成网页对象（类似于打开文件）
            std::string html_path = template_path + "question.html";
            // html_path:要渲染的网页地址，ctemplate::DO_NOT_STRIP：网页渲染时不需要有优化（跳过空行等）
            ctemplate::Template *htl = ctemplate::Template::GetTemplate(html_path, ctemplate::DO_NOT_STRIP);

            //3、渲染
            htl->Expand(&html, &dict); //html：根据htl和dict最终渲染后的网页成品
        }
    };
}